import random
import re
# 从 flask 模块导入 current_app、jsonify、request 和 Blueprint 类
# current_app 用于获取当前活动的 Flask 应用实例
# jsonify 用于将 Python 字典或列表转换为 JSON 响应
# request 用于处理客户端的 HTTP 请求
# Blueprint 用于创建 Flask 应用的蓝图，方便组织路由
from flask import current_app, jsonify, request, Blueprint

# 导入自定义的 utils 模块，可能包含一些工具函数
import utils
# 从 app 包中导入 redis_client 和 LogService 类
# redis_client 用于与 Redis 数据库进行交互
# LogService 用于记录日志
from app import redis_client, LogService
# 从 presenter 模块导入 MobileCodePresenter 类，用于处理验证码相关的展示逻辑
from presenter import MobileCodePresenter
# 从 utils 模块导入 create_response 函数和 StateCode 类
# create_response 用于创建统一格式的响应
# StateCode 用于定义响应状态码
from utils import create_response, StateCode

# 从当前应用的配置中获取 SECRET_KEY
key = current_app.config['SECRET_KEY']
# 创建一个名为 'mobile_server' 的蓝图
mobile_bp = Blueprint('mobile_server', __name__)

@mobile_bp.route('/mobile/get_verify_code', methods=['POST'])
def getVerifyCode():
    """
    处理获取手机验证码的请求。

    该函数接收一个包含手机号码的 POST 请求，
    验证手机号码的格式，若格式正确则生成验证码并存储到 Redis 中，
    最后返回包含验证码信息的响应。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码的元组。
    """
    # 从请求的 JSON 数据中获取手机号码
    mobile_no = request.json.get('mobileNo')
    # 调用 utils 模块中的 checkMobile 函数验证手机号码格式
    if not utils.checkMobile(mobile_no):
        # 若格式不正确，使用 create_response 函数创建包含手机号码错误状态码的响应
        return jsonify(create_response(StateCode.MOBILE_ERROR)), 400
    # 调用 getVerificationCode 函数生成并获取验证码
    sent_code = getVerificationCode(mobile_no)
    # 使用 MobileCodePresenter 类处理验证码信息，并转换为字典格式
    mobile_present = MobileCodePresenter(sent_code).as_dict()
    # 调用 LogService 的 log 方法记录日志
    LogService.log()
    # 使用 create_response 函数创建包含成功状态码和验证码展示数据的响应
    return jsonify(create_response(StateCode.SUCCESS, data=mobile_present)), 200

@mobile_bp.route('/mobile/check', methods=['POST'])
def checkMobile():
    """
    验证手机号码格式是否正确。

    该函数接收一个包含手机号码的 POST 请求，
    使用正则表达式验证手机号码格式，并返回验证结果。

    Returns:
        tuple: 包含 JSON 响应和 HTTP 状态码的元组。
    """
    # 定义匹配中国手机号码的正则表达式模式
    # 手机号码以 1 开头，第二位是 3 - 9 之间的数字，后面跟着 9 位数字
    pattern = r'^1[3-9]\d{9}$'
    # 从请求的 JSON 数据中获取手机号码
    number = request.json.get('mobileNo')
    # 定义验证结果的字典
    state = {
        # 使用 re.match 函数验证手机号码是否匹配模式
        "result": bool(re.match(pattern, number))
    }
    # 调用 LogService 的 log 方法记录日志
    LogService.log()
    # 使用 create_response 函数创建包含成功状态码和验证结果的响应
    return jsonify(create_response(StateCode.SUCCESS, data=state)), 200

def getVerificationCode(mobile_no):
    """
    生成并存储手机验证码到 Redis 中。

    该函数生成一个随机的 6 位数字验证码，
    并将其存储到 Redis 中，设置过期时间为 300 秒。

    Args:
        mobile_no (str): 手机号码。

    Returns:
        str: 生成的验证码，如果存储失败则返回 None。
    """
    # 调用 generateRandomNumber 函数生成验证码
    verification_code = generateRandomNumber()
    # 将验证码存储到 Redis 中，设置过期时间为 300 秒
    if redis_client.set(mobile_no, verification_code, 300):
        return verification_code
    else:
        # 若存储失败，打印 Redis 客户端信息
        print(f"{redis_client.client}")

# 生成 6 位随机数字
def generateRandomNumber(length=6):
    """
    生成指定长度的随机数字。

    该函数生成一个指定长度的随机数字，确保生成的数字至少有指定长度，
    即使前几位是 0。

    Args:
        length (int, optional): 随机数字的长度，默认为 6。

    Returns:
        int: 生成的随机数字。
    """
    # 生成一个指定长度的随机数字，范围是从 10 的 (length - 1) 次方到 10 的 length 次方减 1
    number = random.randint(10 ** (length - 1), 10 ** length - 1)
    return number